package br.com.dataphonebr.specification;

import android.content.Context;
import br.com.dataphonebr.R;
import br.com.dataphonebr.entity.Atividade;
import br.com.dataphonebr.entity.Entity;

public class AtividadeSpecification extends GenericSpecification<Atividade> {

	public AtividadeSpecification(Context context) {
		super(context);
	}
	
	@Override
	public String updateSpecification(Entity instance) {
		return this.persistSpecification(instance);
	}
	
	@Override
	public String persistSpecification(Entity instance) {
		Atividade atividade = (Atividade)instance;
		if (atividade.getTitulo() == null || atividade.getTitulo().isEmpty()){
			return getMandatoryStandardMessage(R.string.tituloLbl);
		}
		if (atividade.getGrupo() == null || atividade.getGrupo().getCodigo() == null){
			return getMandatoryStandardMessage(R.string.grupoLbl);
		}
		if (atividade.getDataIni() != null && atividade.getDataFim() != null){
			if (atividade.getDataIni().after(atividade.getDataFim()))
				return context.getString(R.string.wrn_initial_date_higher_than_final_date);
		}
		if (atividade.getPeriodoNotificacao() != null){
			switch (atividade.getPeriodoNotificacao()){
				case NENHUM : {
					atividade.setNotificacaoMensal(null);
					atividade.setSegunda(null);
					atividade.setTerca(null);
					atividade.setQuarta(null);
					atividade.setQuinta(null);
					atividade.setSexta(null);
					atividade.setSabado(null);
					atividade.setDomingo(null);
					atividade.setRenovarAutomaticamente(false);
				}
				break;
				case POR_DIA : {
					atividade.setNotificacaoMensal(null);
					if (atividade.getSegunda() == null && atividade.getTerca() == null && atividade.getQuarta() == null && atividade.getQuinta() == null && atividade.getSexta() == null && atividade.getSabado() == null && atividade.getDomingo() == null){
						return context.getString(R.string.wrn_enter_weekdays_appointment);
					}
					if (!atividade.getSegunda() && !atividade.getTerca() && !atividade.getQuarta() && !atividade.getQuinta() && !atividade.getSexta() && !atividade.getSabado() && !atividade.getDomingo()){
						return context.getString(R.string.wrn_enter_weekdays_appointment);
					}
				}
				break;
				case DUAS_SEMANAS :
				case POR_MES :
				case BIMESTRAL :
				case TRIMESTRAL :
				case SEMESTRAL :
				case ANUAL : {
					atividade.setSegunda(null);
					atividade.setTerca(null);
					atividade.setQuarta(null);
					atividade.setQuinta(null);
					atividade.setSexta(null);
					atividade.setSabado(null);
					atividade.setDomingo(null);
					if (atividade.getDataIni() == null){
						return getMandatoryStandardMessage(R.string.dataIniLbl);
					}
					if (atividade.getNotificacaoMensal() == null){
						return getMandatoryStandardMessage(R.string.tipoRepeticaoLbl);
					}
				}
				break;
				}
		}
		if (atividade.getNotificacaoMensal() != null){
			switch (atividade.getNotificacaoMensal()){
				case VENCIMENTO : {
					if (atividade.getDataVencimento() == null){
						return getMandatoryStandardMessage(R.string.dataVencimentoLbl);
					} else {
						if (atividade.getDataIni() != null){
							if (atividade.getDataIni().after(atividade.getDataVencimento()))
								return context.getString(R.string.wrn_due_date_higher_than_final_date);
						}
						if (atividade.getDataFim() != null){
							if (atividade.getDataFim().before(atividade.getDataVencimento()))
								return context.getString(R.string.wrn_final_date_higher_than_due_date);
						}
					}
					
					if (atividade.getDataIni() == null || atividade.getDataFim() == null){
						return context.getString(R.string.wrn_due_date_joined_initial_and_final_date);
					}
				}
			break;
				case CONCLUSAO :
				case VALIDADE : {
					if (atividade.getDataIni() == null){
						return getMandatoryStandardMessage(R.string.dataIniLbl);
					}
				}
				break;
			}
		}
		
		if (atividade.getTipoAlerta() == null){
			return getMandatoryStandardMessage(R.string.alertaLbl);
		} else {
			switch (atividade.getTipoAlerta()){
				case CINCO_MINUTOS:
				case DEZ_MINUTOS:
				case QUINZE_MINUTOS:
				case TRINTA_MINUTOS:
				case UMA_HORA:
				case DUAS_HORAS:
				case TRES_HORAS:
				case CINCO_HORAS: {
					if (atividade.getHoraIni() == null){
						return context.getString(R.string.wrn_initial_date_time_alarm);
					}
				}
				break;

				case UM_DIA:
				case DOIS_DIAS:
				case TRES_DIAS: {
					if (atividade.getDataIni() == null){
						return context.getString(R.string.wrn_initial_date_day_alarm);
					}
				}
				break;
			
				default:
				break;
			}
		}
		
		if (atividade.getRenovarAutomaticamente() == null)
			atividade.setRenovarAutomaticamente(false);
		return null;
	}
	

}
